// package com.zdw.demo.config.appender;
//
// import ch.qos.logback.classic.spi.ILoggingEvent;
// import ch.qos.logback.core.AppenderBase;
// import cn.hutool.core.util.StrUtil;
// import com.alibaba.druid.pool.DruidDataSource;
// import lombok.Setter;
//
// import javax.sql.DataSource;
// import java.sql.Connection;
// import java.sql.PreparedStatement;
// import java.sql.SQLException;
// import java.time.LocalDate;
// import java.time.format.DateTimeFormatter;
// import java.util.ArrayList;
// import java.util.List;
//
// @Setter
// public class ClickHouseAppender extends AppenderBase<ILoggingEvent> {
//     private DataSource dataSource; // Druid数据源
//     private String     appName; // 应用名
//     private String     appEnv; // 当前环境
//     private String     appSwitch; // Appender开关
//     private String     druidUrl; // 连接池URL
//     private String     druidUsername; // 用户名
//     private String     druidPassword; // 密码
//     private String     druidInitialsize; // 初始化连接数
//     private String     druidMaxActive; // 最大连接数
//
//     private String              currentDate; // 当前日期
//     private List<ILoggingEvent> buffer = new ArrayList<>(); // 日志缓冲区
//
//     //Druid连接池配置
//
//
//     @Override
//     public void start() {
//         if (StrUtil.isNotEmpty(appSwitch) && StrUtil.equals(appSwitch, "true")) {
//             // 初始化Druid连接池
//             initDruid();
//             // 根据应用名称创建数据库(如果不存在),只在第一次创建
//             createDatabase();
//             super.start();
//         }
//     }
//
//     @Override
//     protected void append(ILoggingEvent event) {
//         buffer.add(event);
//         if (buffer.size() >= 10) { // 批量插入(10条为一批次)
//             insertBatch();
//             buffer.clear();
//         }
//         checkDateChange(); // 检查日期变化
//     }
//
//     private void initDruid() {
//         DruidDataSource ds = new DruidDataSource();
//         ds.setUrl(druidUrl); // ClickHouse地址
//         ds.setUsername(druidUsername); // 用户名
//         ds.setPassword(druidPassword); // 密码
//         ds.setInitialSize(Integer.parseInt(druidInitialsize)); // 初始连接数
//         ds.setMaxActive(Integer.parseInt(druidMaxActive)); // 最大连接数
//         this.dataSource = ds;
//     }
//
//     private void createDatabase() {
//         String sql = String.format("CREATE DATABASE IF NOT EXISTS %s", appName.toLowerCase());
//         executeSql(sql);
//     }
//
//     private void checkAndCreateTable() {
//         String today     = LocalDate.now().format(DateTimeFormatter.BASIC_ISO_DATE);
//         String tableName = "log_" + today;
//         String sql = String.format(
//                 "CREATE TABLE IF NOT EXISTS %s.%s (" +
//                         "timestamp DateTime," +
//                         "level String," +
//                         "message String," +
//                         "logger String," +
//                         "thread String," +
//                         "env String," +
//                         "stacktrace Nullable(String)" +
//                         ") ENGINE = MergeTree() ORDER BY timestamp", appName.toLowerCase(), tableName);
//         executeSql(sql);
//         currentDate = today;
//     }
//
//     private void insertBatch() {
//         // 创建数据库下的表(如果不存在),每次都会检查并创建,因为每天的表不同
//         checkAndCreateTable();
//         //批量插入
//         String tableName = "log_" + currentDate;
//         String sql = String.format(
//                 "INSERT INTO %s.%s (timestamp, level, message, logger, thread, env, stacktrace) VALUES (?, ?, ?, ?, ?, ?, ?)",
//                 appName.toLowerCase(), tableName);
//         try (Connection conn = dataSource.getConnection();
//              PreparedStatement stmt = conn.prepareStatement(sql)) {
//             for (ILoggingEvent event : buffer) {
//                 stmt.setObject(1, event.getTimeStamp() / 1000); // 将毫秒转换为秒
//                 stmt.setString(2, event.getLevel().toString());
//                 stmt.setString(3, event.getFormattedMessage());
//                 stmt.setString(4, event.getLoggerName());
//                 stmt.setString(5, event.getThreadName());
//                 stmt.setString(6, appEnv.toLowerCase());
//                 stmt.setString(7, event.getThrowableProxy() != null ? event.getThrowableProxy().getMessage() : null);
//                 stmt.addBatch();
//             }
//             stmt.executeBatch();
//         } catch (SQLException e) {
//             addError("Insert log to ClickHouse failed", e);
//         }
//     }
//
//     private void checkDateChange() {
//         String today = LocalDate.now().format(DateTimeFormatter.BASIC_ISO_DATE);
//         if (!today.equals(currentDate)) {
//             checkAndCreateTable();
//             currentDate = today;
//         }
//     }
//
//     private void executeSql(String sql) {
//         try (Connection conn = dataSource.getConnection();
//              PreparedStatement stmt = conn.prepareStatement(sql)) {
//             stmt.execute();
//         } catch (SQLException e) {
//             addError("Execute SQL failed: " + sql, e);
//         }
//     }
//
// }